home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr05 / xnot12a.zip / W3FONT.C < prev    next >
C/C++ Source or Header  |  1993-05-20  |  8KB  |  288 lines

  1. #ifdef MSW
  2.  
  3. /* This started out as simple font management for the .ini file, but
  4. * it turned out I felt like keeping other display info-type things in the
  5. * .ini file, so you'll notice other non-font things in this file. I
  6. * should've created a new file, but I wanted to keep the .ini file in
  7. * once place and didn't want to spend the time to generalize the access. 
  8. * Yes, I know - bad karma. (JAM)
  9. */  
  10. #include "stdlib.h"
  11. #include "jam.h"
  12. #include "def.h"
  13. #include "stdio.h"
  14. #include "ttydef.h"
  15. #include "chrdef.h"
  16. #include "commdlg.h"
  17.  
  18. /* user picks the font
  19. */ 
  20. static CHOOSEFONT *newfont;
  21. static LOGFONT *emaxfont;
  22. static TEXTMETRIC *textmetric;
  23.  
  24. static void LoadTheFont(void);
  25.  
  26. static COLORREF ttfore, ttback, tthigh;
  27. static BOOL newuser = TRUE;
  28.  
  29. /* saveall settings 
  30. */
  31. static char profile[NFILEN];
  32.  
  33. static char NEAR *textcolor = "text";
  34. static char NEAR *highcolor = "touched";
  35. static char NEAR *windowcolor = "window";
  36. static char NEAR *newuserstr = "newuser";
  37. static char NEAR *weight = "weight";
  38. static char NEAR *height = "height";
  39. static char NEAR *name = "name";
  40. static char NEAR *pitch = "pitch";
  41. static char NEAR *slant = "slant";
  42. static char NEAR *defname = "terminal";
  43. static char NEAR *rows = "rows";
  44. static char NEAR *cols = "cols";
  45. static char NEAR *xpos = "x";
  46. static char NEAR *ypos = "y";
  47. static char NEAR *format = "%d";
  48. static char NEAR *lformat = "%lu";
  49.  
  50. #define Weight (FF_MODERN | FW_NORMAL)
  51.  
  52. /* resource string, default value 
  53. */
  54. #define SaveStringResource(r, v)\
  55.     WritePrivateProfileString(g_APPNAME, r, v, profile)
  56.  
  57. /* resource string, default value
  58. */ 
  59. #define LoadIntResource(r, v)\
  60.         (int)GetPrivateProfileInt(g_APPNAME, r, v, profile)
  61.  
  62. /* resource string, default value, buffer, sizeof(buffer) 
  63. */
  64. #define LoadStringResource(r, v, b, sz)\
  65.         GetPrivateProfileString(g_APPNAME, r, v, b, sz, profile)
  66.  
  67. /* save settings - fonts, pos/size, color, whatever
  68. */
  69. void SaveAllSettings(void)
  70. {
  71.   char buf[100];
  72.   RECT rect;
  73.  
  74.   /* fonts
  75.   */
  76.   SaveStringResource(name, emaxfont->lfFaceName);   /* family name */
  77.   sprintf(buf, format, emaxfont->lfWeight);
  78.   SaveStringResource(weight, buf);                 /* weight */
  79.   sprintf(buf, format, emaxfont->lfHeight);
  80.   SaveStringResource(height, buf);                 /* height */
  81.   sprintf(buf, format, emaxfont->lfPitchAndFamily);
  82.   SaveStringResource(pitch, buf);                  /* pitch & family */
  83.   sprintf(buf, format, emaxfont->lfItalic);
  84.   SaveStringResource(slant, buf);                  /* italic or not */
  85.  
  86.   /* colors
  87.   */
  88.   sprintf(buf, lformat, ttfore);
  89.   SaveStringResource(textcolor, buf);
  90.   sprintf(buf, lformat, ttback);
  91.   SaveStringResource(windowcolor, buf);
  92.   sprintf(buf, lformat, tthigh);
  93.   SaveStringResource(highcolor, buf);
  94.  
  95.   /* pos, rows, cols
  96.   */
  97.   if (!IsIconic(g_hWnd) && !IsZoomed(g_hWnd))
  98.     {
  99.     GetWindowRect(g_hWnd, &rect);
  100.     sprintf(buf, format, rect.left);
  101.     SaveStringResource(xpos, buf);
  102.     sprintf(buf, format, rect.top);
  103.     SaveStringResource(ypos, buf);
  104.  
  105.     sprintf(buf, format, nrow); 
  106.     SaveStringResource(rows, buf);
  107.     sprintf(buf, format, ncol); 
  108.     SaveStringResource(cols, buf);
  109.     WindowMessage("Current font & window settings saved", FALSE);
  110.     }
  111.   else
  112.     WindowMessage("Current font & colors saved.", FALSE);
  113. }
  114.  
  115. /* set the requested font size
  116.  *
  117.  * NOTE: this routine must be called before code which 
  118.  * restores settings, etc since it allocates data and computes
  119.  * ini file name. (is called by WinMain in w3win)
  120.  */
  121. void WindowInitFont(int fontsize)
  122. {
  123.   if (!profile[0])
  124.     {
  125.       strcpy(profile, g_APPNAME);
  126.       strcat(profile, ".ini");
  127.     }
  128.  
  129.   /* set font, see if resources saved
  130.   */
  131.   if (!(emaxfont = (LOGFONT *)calloc(1, sizeof(LOGFONT))))
  132.     WindowMessage("Unable to get LOGFONT", TRUE);
  133.   if (!(textmetric = (TEXTMETRIC *)calloc(1, sizeof(TEXTMETRIC))))
  134.     WindowMessage("Unable to get TEXTMETRIC", TRUE);
  135.  
  136.   LoadStringResource(name, defname, emaxfont->lfFaceName, LF_FACESIZE);
  137.   emaxfont->lfWeight = LoadIntResource(weight, Weight);
  138.   emaxfont->lfHeight = LoadIntResource(height, fontsize);
  139.   emaxfont->lfPitchAndFamily = (BYTE)LoadIntResource(pitch, FIXED_PITCH);
  140.   emaxfont->lfItalic = (BYTE)LoadIntResource(slant, 0);
  141.  
  142.   newuser = LoadIntResource(newuserstr, TRUE);
  143.  
  144.   /* create the font, then refetch the attributes
  145.   * of the resulting match
  146.   */
  147.   LoadTheFont();
  148.   GetObject(g_hfont, sizeof(LOGFONT), emaxfont);  
  149. }
  150.  
  151. /* work routine to create and set a LOGFONT into g_hDC
  152. */
  153. static void LoadTheFont()
  154. {  
  155.   /* delete any previous font created
  156.    */
  157.   if (g_oldFont)
  158.     {
  159.       SelectObject(g_hDC, g_oldFont);
  160.       DeleteObject(g_hfont);  
  161.     }
  162.  
  163.   /* create new requested font
  164.   */
  165.   g_hfont = CreateFontIndirect(emaxfont);
  166.   g_oldFont = SelectObject(g_hDC, g_hfont);
  167.   GetTextMetrics(g_hDC, textmetric);
  168.   g_nLineHeight = textmetric->tmExternalLeading + textmetric->tmHeight;
  169.   g_nCharWidth = textmetric->tmMaxCharWidth + textmetric->tmOverhang;
  170. }
  171.  
  172. /* dialogbox for new font
  173. */
  174. void WindowNewFont(void)
  175. {
  176.   /* Before bringing up the dialog, kill the current
  177.    * cursor (size defined by current font). WM_KILLFOCUS msg 
  178.    * triggers a cursor delete, WM_SETFOCUS recreates it
  179.    * and thus it comes back the (new) right size.
  180.    */
  181.   SendMessage(g_hWnd, WM_KILLFOCUS, 0, 0L);    /* bye bye cursor */
  182.  
  183.   /* Init the structure and do dialog
  184.   */
  185.   if (!(newfont = ( CHOOSEFONT *)calloc(1, sizeof(LOGFONT))))
  186.     WindowMessage("Unable to get CHOOSEFONT", TRUE);
  187.   newfont->lStructSize = sizeof(CHOOSEFONT);
  188.   newfont->hwndOwner = g_hWnd;
  189.   newfont->lpLogFont = emaxfont;
  190.   newfont->nFontType = SCREEN_FONTTYPE;
  191.   newfont->Flags = CF_SCREENFONTS | CF_FIXEDPITCHONLY | CF_INITTOLOGFONTSTRUCT;
  192.   ChooseFont(newfont);
  193.   LoadTheFont();
  194.   free((void *)newfont);
  195.  
  196.   /* Send redraw/resize instruction (new # rows/cols based on
  197.   * new font size) and recreate the cursor reflecting font cell size.
  198.   */
  199.   ExtendedFunction(function_name(myrefresh));
  200.   SendMessage(g_hWnd, WM_SETFOCUS, 0, 0L);
  201. }
  202.  
  203. /* Size the window based on current font and resources
  204. * for cols, lines, and colors
  205. */
  206. void InitWindow(int numcols, int numlines)
  207. {
  208.   char fore[100], back[100], high[100];
  209.   int oldcols = LoadIntResource(cols, numcols);
  210.   int oldlines = LoadIntResource(rows, numlines);
  211.   int x = LoadIntResource(xpos, 0);
  212.   int y = LoadIntResource(ypos, 0);
  213.  
  214.   SizeWindow(x, y, oldcols, oldlines); 
  215.  
  216.   /* Colors.
  217.   */
  218.   ttfore = GetSysColor(COLOR_WINDOWTEXT);
  219.   tthigh = GetSysColor(COLOR_ACTIVECAPTION);    /* ughly choice.. */
  220.   ttback = GetSysColor(COLOR_WINDOW);
  221.   fore[0] = high[0] = back[0] = '\0';
  222.   LoadStringResource(textcolor, NULL, fore, sizeof(fore));
  223.   LoadStringResource(highcolor, NULL, high, sizeof(high));
  224.   LoadStringResource(windowcolor, NULL, back, sizeof(back));
  225.  
  226.   if (fore[0])
  227.     sscanf(fore, lformat, &ttfore);
  228.   if (back[0])
  229.     sscanf(back, lformat, &ttback);
  230.   if (high[0])
  231.     sscanf(high, lformat, &tthigh);
  232. }
  233.  
  234. /* tty access to colors for refresh
  235. */
  236. COLORREF GetForeColor()
  237. {
  238.   return (ttfore);
  239. }
  240. COLORREF GetHighColor()
  241. {
  242.   return (tthigh);
  243. }
  244. COLORREF GetBackColor()
  245. {
  246.   return(ttback);
  247. }
  248.  
  249. /* Access to saveable preferences, called from w3win
  250. * as a result of system menu choices for TEXT COLOR and WINDOW COLOR
  251. */
  252. void SetForeColor(color)
  253. COLORREF color;
  254. {
  255.   ttfore = color;
  256. }
  257. void SetBackColor(color)
  258. COLORREF color;
  259. {
  260.   ttback = color;
  261. }
  262. void SetHighColor(color)
  263. COLORREF color;
  264. {
  265.   tthigh = color;
  266. }
  267.  
  268. /* One time greeting box; same dialog as seen from ABOUT menu.
  269. * If no .ini file is found on startup, greet the user.
  270. */
  271. BOOL newUser()
  272. {
  273.   char buf[128];
  274.   BOOL was = newuser;
  275.  
  276.   /* user type
  277.   */
  278.   if (was)
  279.     {
  280.       sprintf(buf, format, newuser = FALSE);
  281.       SaveStringResource(newuserstr, buf);
  282.     }
  283.  
  284.   return (was);
  285. }
  286.  
  287. #endif /* MSW */
  288.